<?php
/**
 * Created by PhpStorm.
 * User: dt
 * Time: 16:53
 */
namespace frontend\base;

use frontend\utils\AliyunSms\Sms;
use common\base\BController;
use Yii;


/**
 * 控制器基类
 * @package app\base
 */
class BaseController extends BController
{

    public function beforeAction($action){
        $this->enableCsrfValidation=false;
        $this->body();
        // $this->saveUserIp(1);
       return true;
    }

     /**
     * 获取Web端直传Oss参数
     * @param string $dir
     * @return string
     */
    public static function getOssUpload($dir='image/'){
        function gmt_iso8601($time) {
            $dtStr = date("c", $time);
            $mydatetime = new \DateTime($dtStr);
            $expiration = $mydatetime->format(\DateTime::ISO8601);
            $expiration = substr($expiration, 0, strpos($expiration, '+'));
            return $expiration."Z";
        }
        $end = time()+30;
        $expiration = gmt_iso8601($end);//设置该policy超时时间是10s. 即这个policy过了这个有效时间，将不能访问

        //最大文件大小.用户可以自己设置
        $conditions[] = array(0=>'content-length-range', 1=>0, 2=>1048576000);
        //表示用户上传的数据,必须是以$dir开始, 不然上传会失败,这一步不是必须项,只是为了安全起见,防止用户通过policy上传到别人的目录
        $conditions[] = array(0=>'starts-with', 1=>'$key', 2=>$dir);

        $base64_policy = base64_encode(json_encode(array('expiration'=>$expiration,'conditions'=>$conditions)));
        $signature = base64_encode(hash_hmac('sha1', $base64_policy, Yii::$app->params['oss']['secret'], true));

        $response = array();
        $response['accessid'] = Yii::$app->params['oss']['key'];
        $response['host'] = Yii::$app->params['oss']['host'];
        $response['policy'] = $base64_policy;
        $response['signature'] = $signature;
        $response['expire'] = $end;
        //这个参数是设置用户上传指定的前缀
        $response['dir'] = $dir;
        return json_encode($response);
    }

    /***
     *短信发送
     * @param $mobile $type $type $data
     * @return array
     * SmsCodeModel::sendSmsMessage('15888893748','validate_code',['name'=>'张三']);
     */
    public static function sendSmsMessage($mobile,$type='validate_code',$data=[])
    {
        $template = Yii::$app->params['sms']['template'][$type];
        $new_template = [];
        $out_id = time().mt_rand(10000,99999);
        if($data) {
            foreach ($data as $key=>$val){
                if(isset($template[$key]) && $key!= 'template_code'){
                    $new_template[$key]=$val;
                }
            }
        }
        $demo = new Sms(
            Yii::$app->params['sms']['key'],
            Yii::$app->params['sms']['secret']
        );
        $response = $demo->sendSms(
            Yii::$app->params['sms']['sign_name'], // 短信签名
            $template['template_code'], // 短信模板编号
            $mobile, // 短信接收者
            $new_template,
            $out_id
        );
        return ['code'=>$response->Code,'message'=>$response->Message,'biz_id'=>!empty($response->BizId) ? $response->BizId : ''];
    }

    /***
     * IP伪装
     * @param $mobile $type $type $data
     * @return array
     * SmsCodeModel::sendSmsMessage('15888893748','validate_code',['name'=>'张三']);
     */
    function getPostIpData(){
        // 给与IP 段
        $ipData = array(
            119.120.'.'.rand(1,255).'.'.rand(1,255),
            124.174.'.'.rand(1,255).'.'.rand(1,255),
            116.249.'.'.rand(1,255).'.'.rand(1,255),
            118.125.'.'.rand(1,255).'.'.rand(1,255),
            42.175.'.'.rand(1,255).'.'.rand(1,255),
            124.162.'.'.rand(1,255).'.'.rand(1,255),
            211.167.'.'.rand(1,255).'.'.rand(1,255),
            58.206.'.'.rand(1,255).'.'.rand(1,255),
            117.24.'.'.rand(1,255).'.'.rand(1,255),
            203.93.'.'.rand(1,255).'.'.rand(1,255),
        );
        //随机获取一个IP地址
        $ip = $ipData[array_rand($ipData)];
        $agentArray=[
            //PC端的UserAgent
            "safari 5.1 – MAC"=>"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
            "safari 5.1 – Windows"=>"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
            "Firefox 38esr"=>"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
            "IE 11"=>"Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko",
            "IE 9.0"=>"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0",
            "IE 8.0"=>"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
            "IE 7.0"=>"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
            "IE 6.0"=>"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
            "Firefox 4.0.1 – MAC"=>"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
            "Firefox 4.0.1 – Windows"=>"Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
            "Opera 11.11 – MAC"=>"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
            "Opera 11.11 – Windows"=>"Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11",
            "Chrome 17.0 – MAC"=>"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
            "傲游（Maxthon）"=>"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",
            "腾讯TT"=>"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)",
            "世界之窗（The World） 2.x"=>"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
            "世界之窗（The World） 3.x"=>"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)",
            "360浏览器"=>"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
            "搜狗浏览器 1.x"=>"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",
            "Avant"=>"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)",
            "Green Browser"=>"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
        ];
        $userAgent = $agentArray[array_rand($agentArray,1)];  //随机浏览器userAgent
        return $header = array(
            'CLIENT-IP:'.$ip,
            'X-FORWARDED-FOR:'.$ip,
        );    
    }

    /***
     * IP伪装
     * @param 
     * @return array
     */
    function Curl()
    {
        $header = self::getPostIpData();
        //构造ip
        $curl = curl_init(); // 启动一个CURL会话
        curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
        curl_setopt($curl, CURLOPT_REFERER, $referUrl);  //模拟来源网址
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); // 0-跳过证书 1-从证书中检查SSL加密算法是否存在
        curl_setopt($curl, CURLOPT_USERAGENT, $userAgent); // 模拟用户使用的浏览器
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
        curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
        curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
        $info = curl_exec($curl); // 执行操作
        if (curl_errno($curl)) {
            echo 'Errno'.curl_error($curl);//捕抓异常
        }
        curl_close($curl); // 关闭CURL会话
        return $info; // 返回数据，json格式
    }
}